﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Prisa.BussinesLogic;
using Prisa.Entities;
using Microsoft.Practices.Unity;

namespace Prisa.UI
{
    public partial class FrmDetalleCompra : Form
    {
        [Dependency]
        public IProveedorBL proveedorBL { get; set; }
       
        [Dependency]
        public IProductoBL productoBL { get; set; }

        [Dependency]
        public ICompraBL compraBL { get; set; }

        [Dependency]
        public IDetalleCompraBL detallecompraBL { get; set; }

        public FrmDetalleCompra()
        {
            InitializeComponent();
            this.BuildUp();
        }
        
        private void FrmDetalleCompra_Load(object sender, EventArgs e)
        {
            lblMensaje.Visible = false;
            lblAyuda.Visible = false;
        }

        bool bandera;

        public void Nuevo()
        {
            bandera = true;
            cOMPRABindingSource.AddNew();
        }

        public void Editar(int id)
        {
            bandera = false;
            var _compra = compraBL.GetFromCompraById(id);
            cOMPRABindingSource.DataSource = _compra;
            _compra.PROVEEDOR = proveedorBL.GetFromProveedorById(_compra.ProveedorId);
            lblAyuda.Visible = false;
        }

        private void rucTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)// && bandera == true)
            {
                FrmProveedor frm = new FrmProveedor();
                frm.Prove = true;
                frm.ShowDialog();
                if (frm.CurrentProveedor != null)
                {
                    var _compra = cOMPRABindingSource.Current as COMPRA;
                    _compra.PROVEEDOR = frm.CurrentProveedor;
                    _compra.ProveedorId = frm.CurrentProveedor.Id;
                    cOMPRABindingSource.ResetBindings(true);
                    BtnVerificar.Enabled = false;
                }
            }
            if (e.KeyCode == Keys.Enter && rucTextBox.Text.Length > 0) //&& bandera == true
            {
                VerificarProveedor();
            }
        }

        private void rucTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab && rucTextBox.Text.Length > 0)//&& bandera == true
            {
                VerificarProveedor();
            }
        }

        private void BtnVerificar_Click(object sender, EventArgs e)
        {
            if (rucTextBox.Text.Length > 0)
            {
                VerificarProveedor();
            }
        }

        private void VerificarProveedor()
        {
            if (bandera == false)
            {
                lblAyuda.Visible = false;
            }
            var _proveedor = proveedorBL.GetFromProveedorByRuc(rucTextBox.Text);

            if (_proveedor != null)
            {
                var compra = cOMPRABindingSource.Current as COMPRA;
                compra.PROVEEDOR = _proveedor;
                compra.ProveedorId = _proveedor.Id;

                cOMPRABindingSource.ResetBindings(true);
                BtnVerificar.Enabled = false;

            }
            else
            {
                MessageBox.Show("Proveedor NO REGISTRADO", "Mensaje",
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void BuscarEnProductos()
        {
            List<PRODUCTO> existenProductos;
            existenProductos = productoBL.GetFromProductoByDescripcion(TxtDescripcion.Text);

            if (existenProductos.Count <= 0)
            {
                lblMensaje.Visible = true;
            }
            else
            {
                lblMensaje.Visible = false;
                pRODUCTOBindingSource.DataSource = existenProductos;
            }
        }

        private void BtnBuscar_Click(object sender, EventArgs e)
        {
            BuscarEnProductos();
        }

        private void TxtDescripcion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarEnProductos();
            }
        }
              
        private void BtnBuscarProducto_Click(object sender, EventArgs e)
        {
            BuscarProductoEnDetalle();  
        }

        private void TxtProductoDesc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProductoEnDetalle();
            }
        }

        private void BuscarProductoEnDetalle()
        {

            List<DETALLECOMPRA> listatemp = new List<DETALLECOMPRA>();
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var _compra = cOMPRABindingSource.Current as COMPRA;

            if (_compra != null)
            {
                if (TxtProductoDesc.Text != null && TxtProductoDesc.Text != "" && TxtProductoDesc.Text != string.Empty)
                {
                    foreach (var item in _compra.DETALLECOMPRAs)
                    {
                        var descMayus = (TxtProductoDesc.Text).ToUpper();
                        var itemPRO = (item.PRODUCTO.Descripcion).ToUpper();
                        var a = itemPRO.Contains(descMayus);
                        if (a == true)
                        {
                            listatemp.Add(item);
                        }
                    }
                    dETALLECOMPRAsBindingSource.DataSource = listatemp;
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }
                else
                {
                    dETALLECOMPRAsBindingSource.DataSource = _compra.DETALLECOMPRAs;
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen productos en la Compra", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void pRODUCTODataGridView_DoubleClick(object sender, EventArgs e)
        {
            AgregarProducto();
        }

        private void AgregarProducto()
        {
            PRODUCTO _producto = pRODUCTOBindingSource.Current as PRODUCTO;
            COMPRA _compra = cOMPRABindingSource.Current as COMPRA;

            if (_producto != null)
            {
                var detalle = new DETALLECOMPRA
                {
                    CompraId = _compra.Id,
                    ProductoId = _producto.Id,
                    PRODUCTO = _producto,
                    Cantidad = 1,
                    PrecioUnit = _producto.Costo
                };
                var existe = _compra.DETALLECOMPRAs.Where(dp => dp.ProductoId.Equals(_producto.Id)).SingleOrDefault();

                if (existe == null)
                {
                    _compra.DETALLECOMPRAs.Add(detalle);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El producto: {0}," + "ya se encuentra en el pedido",
                        _producto.Descripcion), "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                CalcularTotal();
                cOMPRABindingSource.ResetBindings(true);
                dETALLECOMPRAsBindingSource.ResetBindings(true);
            }
        }

        private void CalcularTotal()
        {
            var _compra = cOMPRABindingSource.Current as COMPRA;

            if (_compra != null)
            {
                var total = _compra.DETALLECOMPRAs.Sum(dp => dp.Monto);
                int totalRound = (int)Math.Round(total, 0);

                if (total > totalRound)
                {
                    _compra.Total = totalRound + 1;
                }
                else _compra.Total = totalRound;
                
                cOMPRABindingSource.ResetBindings(true);
            }
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            GuardarCompra();
        }

        private void GuardarCompra()
        {
            var _compra = cOMPRABindingSource.Current as COMPRA;
            var msg = "ERROR";
            var fechaDTP = fechaDateTimePicker.Value.Date;

            if (_compra != null)
            {
                _compra.NroGuia = nroGuiaTextBox.Text.ToUpper();
                if (bandera == true)
                {
                    try
                    {
                        var cant = 0;
                        foreach (var item in _compra.DETALLECOMPRAs)
                        {
                            if (item.Cantidad > 0 && item.PrecioUnit > 0)
                            {
                                cant++;
                            }
                            else MessageBox.Show("El precio del producto " + item.PRODUCTO.Descripcion + " debe ser mayor a  0", "Mensaje", 
                                MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                        if (cant == _compra.DETALLECOMPRAs.Count)
                        {
                            _compra.Fecha = fechaDTP;
                            compraBL.AddCompra(_compra);
                            //bandera = false;
                            MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                if (bandera == false)
                {
                    try
                    {
                        var cant = 0;
                        foreach (var item in _compra.DETALLECOMPRAs)
                        {
                            if (item.Cantidad > 0 && item.PrecioUnit > 0)
                            {
                                cant++;
                            }
                            else MessageBox.Show("El precio del producto " + item.PRODUCTO.Descripcion + " debe ser mayor a  0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        }

                        if (cant == _compra.DETALLECOMPRAs.Count)
                        {
                            _compra.Fecha = fechaDTP;
                            compraBL.UpdateCompra(_compra);
                            Editar(_compra.Id);
                            MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }

        private void dETALLECOMPRAsDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                var _compra = cOMPRABindingSource.Current as COMPRA;
                var _detalle = dETALLECOMPRAsBindingSource.Current as DETALLECOMPRA;

                var rpt = MessageBox.Show(this,
                        string.Format("¿Desea quitar el producto del pedido?"),"Mensaje",
                        MessageBoxButtons.YesNo,MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    if (_detalle.Id > 0)
                    {
                        detallecompraBL.RemoveDetalleCompraByProductoIdAndCompraId(_detalle.PRODUCTO.Id, _compra.Id); 
                    }
                    dETALLECOMPRAsBindingSource.RemoveCurrent();
                    CalcularTotal();
                }
            }
        }

        private void pRODUCTODataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                PRODUCTO _producto = pRODUCTOBindingSource.Current as PRODUCTO;
                COMPRA _compra = cOMPRABindingSource.Current as COMPRA;

                if (_producto != null)
                {
                    var detalle = new DETALLECOMPRA
                    {
                        CompraId = _compra.Id,
                        ProductoId = _producto.Id,
                        PRODUCTO = _producto,
                        Cantidad = 1,
                        PrecioUnit = 0

                    };

                    var existe = _compra.DETALLECOMPRAs.Where(dp => dp.PRODUCTO.Id.Equals(_producto.Id)).SingleOrDefault();

                    if (existe == null)
                    {
                        _compra.DETALLECOMPRAs.Add(detalle);
                        _compra.Total = _compra.DETALLECOMPRAs.Sum(p => p.Monto);
                    }
                    else
                    {
                        var rpt = MessageBox.Show(this,string.Format("El producto: {0}," +
                            "ya se encuentra en el pedido", _producto.Descripcion),"Mensaje",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);
                        CalcularTotal();
                    }
                    cOMPRABindingSource.ResetBindings(true);
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }                
            }
        }

        private void dETALLECOMPRAsDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 || e.ColumnIndex == 2)
            {
                DETALLECOMPRA _detalle = dETALLECOMPRAsBindingSource.Current as DETALLECOMPRA;

                if (_detalle != null)
                {
                    if (_detalle.Cantidad >= 1)
                    {
                        CalcularTotal();
                    }
                    else
                    {
                        MessageBox.Show("La cantidad no puede ser menor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        _detalle.Cantidad = 1;
                    }

                    var producto = productoBL.GetFromProductoById(_detalle.ProductoId);

                    if ((_detalle.PrecioUnit > producto.Costo || _detalle.PrecioUnit < producto.Costo) && _detalle.PrecioUnit != 0 )
                    {
                        MessageBox.Show("El Precio del producto es diferente al costo actual", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        frmMttoProducto frm = new frmMttoProducto();
                        //frm.CurrentProducto = producto;
                        frm.EditarOfCompra(_detalle.PrecioUnit, producto.Id);
                        frm.ShowDialog();
                    }
                    

                    var _CurrentProducto = productoBL.GetFromProductoById(_detalle.ProductoId);
                    _detalle.PrecioUnit = _CurrentProducto.Costo;
                    CalcularTotal();
                    dETALLECOMPRAsBindingSource.ResetBindings(true);
                }
            }
        }

        private void BtnNewProducto_Click(object sender, EventArgs e)
        {
            var frm = new frmMttoProducto();
            frm.Nuevo();
            frm.ShowDialog();
            pRODUCTOBindingSource.DataSource = productoBL.GetFromProductoByDescripcion(TxtDescripcion.Text);
            lblMensaje.Visible = false;
        }

        private void rucTextBox_TextChanged(object sender, EventArgs e)
        {
            if (bandera == false)
            {
                lblAyuda.Visible = false;
            }
            else
            lblAyuda.Visible = true;
        }

        private void rucTextBox_Leave(object sender, EventArgs e)
        {
            lblAyuda.Visible = false;
        }

        private void rucTextBox_Click(object sender, EventArgs e)
        {
            if (bandera == false)
            {
                lblAyuda.Visible = false;
            }
            else
                lblAyuda.Visible = true;
        }

        private void rucTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back)
                && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear))
            {
                e.Handled = true;
                return;
            }
        }

        private void pRODUCTODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.pRODUCTODataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
            {
                AgregarProducto();
            }
        }

        private void dETALLECOMPRAsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.dETALLECOMPRAsDataGridView.Columns[e.ColumnIndex].Name.Equals("Quitar"))
            {
                var _compra = cOMPRABindingSource.Current as COMPRA;
                var _detalle = dETALLECOMPRAsBindingSource.Current as DETALLECOMPRA;

                var rpt = MessageBox.Show(this,string.Format("¿Desea quitar el producto del pedido?"), "Mensaje",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    if (_detalle.Id > 0)
                    {
                        var productoAlm = productoBL.GetFromProductoById(_detalle.ProductoId);

                        if (_detalle.Cantidad < productoAlm.Stock)
                        {
                            detallecompraBL.RemoveDetalleCompraByProductoIdAndCompraId(_detalle.PRODUCTO.Id, _compra.Id);
                            dETALLECOMPRAsBindingSource.RemoveCurrent();
                        }
                        else
                        {
                            //MessageBox.Show("La cantidad del detalle excede el stock actual del Producto","Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            MessageBox.Show("Ya se redujo el stock del Producto actual", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else dETALLECOMPRAsBindingSource.RemoveCurrent();
                    
                    CalcularTotal();
                }
            }

        }

        private void nroGuiaTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back)
                && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear))
            {
                e.Handled = true;
                return;
            }
        }

        private void dETALLECOMPRAsDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Asegúrese de ingresar valores correctos", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void TxtDescripcion_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var coma = Convert.ToString(",");
            var punto = Convert.ToString(".");
            var slash = Convert.ToString("/");
            var amber = Convert.ToString("&");

            string cadena = guion + coma + punto + slash + amber + (char)8;
            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void TxtProductoDesc_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var coma = Convert.ToString(",");
            var punto = Convert.ToString(".");
            var slash = Convert.ToString("/");
            var amber = Convert.ToString("&");

            string cadena = guion + coma + punto + slash + amber + (char)8;
            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }
       

      
    }
}


